#include <stdio.h>
#include "ofc/DTree.h"
#include "ofc/DText.h"

int main(int argc, char *argv[])
{
  DTree         *tree = [DTree         new  ];
  DTreeIterator *iter = [DTreeIterator alloc];
  DText         *str1;
  DText         *str2;
  int            level;

  [iter init :tree];                   // Init the iterator with the tree

  str1 = [DText new]; [str1 set :"root"];
  [iter append :str1];                 // Set the root
    
  str1 = [DText new]; [str1 set :"child1"];
  [iter append :str1];                 // Append a child to the root and ..
  [iter parent];                       // .. move the iterator back to the root

  str1 = [DText new]; [str1 set :"child2"]; // Append again a child to the root and ..
  [iter append :str1];                 // .. keep the iterator on the child

  str1 = [DText new]; [str1 set :"child21"]; // Append a child for the chilld
  [iter append :str1];

  str1 = [DText new]; [str1 set :"child22"]; // Append another child
  [iter after :str1];

  [iter parent];                       // Move iter back to level 2

  str1 = [DText new]; [str1 set :"child4"];
  [iter after :str1];                  // Append after the child a new child

  str2 = [DText new]; [str2 set :"child3"];
  [iter before :str2];                 // Prepend before the child a new child

  printf("Elements in the tree:%ld.\n", [tree length]);

  printf("Tree %s child3.\n", ([tree has :str2] ? "has" : "has not")); 

  level = 1;

  str1 = [iter root];                  // Move the iter to the root
  while (str1 != nil)
  {
    printf("Level:%d Element:%s.\n", level, [str1 cstring]);

    if ([iter hasChildren])            // If the node has children, than move to the first child
    {
      level++;
      str1 = [iter child];
    }
    else if ([iter isLast])            // If all children done, than move to the next of the parent
    {
      level--;
      str1 = [iter parent];            
      if (str1 != nil)
        str1 = [iter next];
    }
    else
    {
      str1 = [iter next];              // Else next child
    }
  }

  [iter free];                         // Cleanup
  [tree free];

  return 0;
}
